package br.com.sgh.arquitetura.service;

import java.io.Serializable;
import java.util.Collection;

import br.com.sgh.arquitetura.dao.DAO;
import br.com.sgh.arquitetura.dao.Entidade;

/**
 * <p> ManutencaoService </p> <p> Descrição: interface de negócio para classes Service para casos de uso de manutenção
 * </p> <br> <b>Empresa:</b> Chesf - Companhia Hidro Elétrica do São Francisco
 * 
 * @param <E> a entidade mantida
 * @param <D> o DAO que manipula a entidade
 * @author rafael.rodrigues
 * @version 1.0
 */
public interface ManutencaoService<E extends Entidade, D extends DAO<E>> extends Serializable {

	/**
	 * Insere em banco de dados instância de entidade
	 * 
	 * @param entidade a entidade a persistir
	 * @return a chave da mensagem de sucesso para a operação
	 * @author Rafael Veloso
	 */
	public String inserir(E entidade);

	/**
	 * Insere em banco de dados instância de entidade
	 * 
	 * @param entidade a entidade a alterar
	 * @return a chave da mensagem de sucesso para a operação
	 * @author Rafael Veloso
	 */
	public String alterar(E entidade);

	/**
	 * Insere ou altera em banco de dados instância de entidade
	 * 
	 * @param entidade a entidade a inserir ou alterar
	 * @return a chave da mensagem de sucesso para a operação
	 * @author Rafael Veloso
	 */
	public String salvar(E entidade);

	/**
	 * Altera em banco de dados instância de entidade que não esteja em estado persistente
	 * 
	 * @param entidade a entidade mesclar
	 * @return a chave da mensagem de sucesso para a operação
	 * @author Rafael Veloso
	 */
	public String mesclar(E entidade);

	/**
	 * Exclui de banco de dados instância de entidade
	 * 
	 * @param entidade a entidade a inserir ou alterar
	 * @return a chave da mensagem de sucesso para a operação
	 * @author Rafael Veloso
	 */
	public String remover(E entidade);

	/**
	 * Exclui em banco de dados as instâncias da entidade
	 * 
	 * @param entidades a entidades a excluir
	 * @return a chave da mensagem de sucesso para a operação
	 * @author Rafael Veloso
	 */
	public String removerTodos(Collection<E> entidades);

	/**
	 * Exclui em banco de dados entidades que têm os IDS passados como parâmetro
	 * 
	 * @param ids ids de entidades a remover
	 * @return a chave da mensagem de sucesso para a operação
	 * @author Rafael Fontoura
	 */
	public String removerTodosPorId(Collection<Serializable> ids);

	/**
	 * Consulta entidades a partir de uma instância como parâmetro efetuando paginação.
	 * 
	 * @param entidade a entidade que serve como parâmetro
	 * @return a coleção de entidades encontradas
	 * @author rafael.rodrigues
	 */
	public Collection<E> consultar(E entidade);

	/**
	 * Consulta todas as entidades vindas do banco de dados efetuando paginação.
	 * 
	 * @return a coleção de entidades encontradas
	 * @author rafael.rodrigues
	 */
	public Collection<E> consultar();

	/**
	 * Consulta todas as entidades vindas do banco de dados.
	 * 
	 * @return a coleção de entidades encontradas
	 * @author rafael.rodrigues
	 */
	public Collection<E> listar();

	/**
	 * Consulta entidade pelo seu identificador.
	 * 
	 * @param id o identificador
	 * @return a entidade encontrada pelo ID
	 * @author rafael.rodrigues
	 */
	public E obter(Serializable id);

	/**
	 * Consulta entidades pelos seus identificadores.
	 * 
	 * @param ids os identificadores
	 * @return a coleção de entidades
	 * @author rafael.rodrigues
	 */
	public Collection<E> obter(Collection<Serializable> ids);
}